#include "BaseType.h"
#include "Tracer.h"

using namespace libemb;
/**
 * 适配器模式：
 * 1.将一个类的接口(被适配者接口)转换为客户期望的接口(目标接口)
 * 2.有两种实现方式：一种是继承方式(继承目标接口和被适配者),一种是组合方式(继承目标接口,组合被适配者)
 * 适用场景：
 * 1.需要将接口不兼容的类引入到当前系统中使用
 **/

//目标：客户端期待的接口
class Target{
DECL_CLASSNAME(Target)
public:
    virtual void useTypeC()=0;
};

//被适配者
class Adaptee{
DECL_CLASSNAME(Adaptee)
public:
    virtual void useLightening()
    {
        TRACE_INFO_CLASS("use Lightening port.");
    }
};

//通过继承方式实现的适配器(继承被适配者)
class AdapterX: public Target,public Adaptee{
DECL_CLASSNAME(AdapterX)
public:
    void useTypeC() override
    {
        TRACE_INFO_CLASS("Type-C <--> Lightening");
        useLightening();
    }

};

//通过组合方式实现的适配器(与被适配者是组合关系)
class AdapterY: public Target{
DECL_CLASSNAME(AdapterY)
public:
    AdapterY()
    {
        m_adaptee = std::make_unique<Adaptee>();
    }
    void useTypeC() override
    {
        TRACE_INFO_CLASS("Type-C <--> Lightening");
        m_adaptee->useLightening();
    }
private:
    std::unique_ptr<Adaptee> m_adaptee;
};


int main()
{
    Tracer::getInstance().setLevel(TRACE_LEVEL_DBG);
	Tracer::getInstance().addSink(std::make_shared<STDSink>()).start();

    AdapterX x;
    x.useTypeC();

    AdapterY y;
    y.useTypeC();

    return RC_OK;
}